package com.burst.reptile.common.utils.job;

import java.text.ParseException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

import org.quartz.CronExpression;

import com.burst.reptile.common.utils.ToolUtil;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;

/**
 * cron表达式工具类
 * 
 * @author wujin
 * @date: 2020年6月9日 下午5:22:00
 */
public class CronUtils {
	
    public static final String NORM_DATETIME_MINUTE_PATTERN = "yyyy-MM-dd HH:mm";
    
    public static final String TRANS_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    public static final String TRANS_CRON_FORMAT_ONCE = "ss mm HH dd MM ? yyyy";

    public static final String TRANS_CRON_FORMAT_DAY = "ss mm HH dd/ * ? *";

    public static final String TRANS_CRON_FORMAT_WEEK = "ss mm HH ? * -- *";

    public static final String TRANS_CRON_FORMAT_MONTH = "ss mm HH dd MM/1 ? *";
	
	/**
	 * 返回一个布尔值代表一个给定的Cron表达式的有效性
	 *
	 * @param cronExpression Cron表达式
	 * @return boolean 表达式是否有效
	 */
	public static boolean isValid(String cronExpression) {
		return CronExpression.isValidExpression(cronExpression);
	}

	/**
	 * 返回一个字符串值,表示该消息无效Cron表达式给出有效性
	 *
	 * @param cronExpression Cron表达式
	 * @return String 无效时返回表达式错误描述,如果有效返回null
	 */
	public static String getInvalidMessage(String cronExpression) {
		try {
			new CronExpression(cronExpression);
			return null;
		} catch (ParseException pe) {
			return pe.getMessage();
		}
	}

	/**
	 * 返回下一个执行时间根据给定的Cron表达式
	 *
	 * @param cronExpression Cron表达式
	 * @return Date 下次Cron表达式执行时间
	 */
	public static LocalDateTime getNextExecution(String cronExpression) {
		try {
			CronExpression cron = new CronExpression(cronExpression);
			Date nextValidTimeAfter = cron.getNextValidTimeAfter(new Date(System.currentTimeMillis()));
			if(ToolUtil.isNotEmpty(nextValidTimeAfter)) {
				Instant instant = nextValidTimeAfter.toInstant();
		        ZoneId zoneId = ZoneId.systemDefault();
		        return instant.atZone(zoneId).toLocalDateTime();
			}
	        return null;
		} catch (ParseException e) {
			throw new IllegalArgumentException(e.getMessage());
		}
	}
	
	 /**
     * 生成只执行一次的cron
     */
    public static String getCronByOnce(String dateStr) {
    	DateTime date = DateUtil.parse(dateStr);
        return DateUtil.format(date, TRANS_CRON_FORMAT_ONCE);
    }
    
    /**
     * 生成每月或每周或每天执行的cron
     */
    public static String getCron(String period, String startDateStr) throws ParseException {
        DateTime date = DateUtil.parse(startDateStr);
        StringBuffer cronStringBuffer = new StringBuffer();
        if ("month".equals(period)) {
            String startDateCron = DateUtil.format(date, TRANS_CRON_FORMAT_MONTH);
            cronStringBuffer.append(startDateCron);
        } else if ("day".equals(period)) {
            String startDateCron =  DateUtil.format(date, TRANS_CRON_FORMAT_DAY);
            cronStringBuffer.append(startDateCron).insert(cronStringBuffer.lastIndexOf("/") + 1, "1");
        } else {
            String startDateCron = DateUtil.format(date, TRANS_CRON_FORMAT_WEEK);
            cronStringBuffer.append(startDateCron.replaceAll("--", period));
        }
        return cronStringBuffer.toString();
    }
    
    
    public static void main(String[] args) {
		String dateStr = "2020-07-30 10:01";
		String cronExpression = getCronByOnce(dateStr);
		LocalDateTime date = getNextExecution(cronExpression);
		System.out.println(date);
		
//		System.out.println(cronExpression);
//		System.out.println(isValid(cronExpression));
//		System.out.println(getInvalidMessage(cronExpression));
//		System.out.println(getNextExecution(cronExpression));
//		
//		String sd = "yyyy-MM-dd HH:mm:ss";
//		System.out.println(sd.length());
//		
//		DateTime date = DateUtil.parse(dateStr);
//		String format = DateUtil.format(date, TRANS_DATE_FORMAT);
//		System.out.println(format);
	}
    
}
